
#include <avr/io.h>
#include <stdio.h>
#include <string.h>

int bluetooth_uart_putchar(char c, FILE * f_unused)      
{
    loop_until_bit_is_set(UCSRA, UDRE); // asteapta pana cand este trimis caracterul anterior

    UDR = c;                            // se scrie bufferul cu caracterul dorit - apoi, automat, 
                                        // UART-ul va face toata treaba
    return 0;
}

int bluetooth_uart_getchar(FILE* f)
{
    char c;
    loop_until_bit_is_set(UCSRA, RXC);  // se asteapta pana exista un caracter nou in bufferul USART-ului
    c = UDR;
/*
    bluetooth_uart_putchar('[', f);
    bluetooth_uart_putchar(c, f);
    bluetooth_uart_putchar(']', f);
    bluetooth_uart_putchar('\n', f);
*/
    return c;
}


int hyperterminal_uart_putchar(char c, FILE * f_unused)      
{
    if(c == '\n')                        // daca caracterul este "end-of-line" CR_LF
        hyperterminal_uart_putchar( '\r', f_unused);        // se reapeleaza functia cu: CR (pentru a face VTerm-ul fericit!)
     
    loop_until_bit_is_set(UCSRA, UDRE); // asteapta pana cand este trimis caracterul anterior

    UDR = c;                            // se scrie bufferul cu caracterul dorit - apoi, automat, 
                                        // UART-ul va face toata treaba
    return 0;
}




int hyperterminal_uart_getchar(FILE* f)
{
    char c;
    
    loop_until_bit_is_set(UCSRA, RXC);  // se asteapta pana exista un caracter nou in bufferul USART-ului

    c = UDR;                            // se preia caracterul

    if(c == '\r')                        // daca este un CR, se inlocuieste cu CRLF (vezi uart_putchar)
        c = '\n';
    hyperterminal_uart_putchar(c,NULL);

    return c;
}

FILE hyperterminal_uart_stdout = FDEV_SETUP_STREAM(hyperterminal_uart_putchar, NULL, _FDEV_SETUP_WRITE);
FILE hyperterminal_uart_stdin  = FDEV_SETUP_STREAM(NULL, hyperterminal_uart_getchar, _FDEV_SETUP_READ);

FILE bluetooth_uart_stdout = FDEV_SETUP_STREAM(bluetooth_uart_putchar, NULL, _FDEV_SETUP_WRITE);
FILE bluetooth_uart_stdin  = FDEV_SETUP_STREAM(NULL, bluetooth_uart_getchar, _FDEV_SETUP_READ);

// initializarea UART-ului ////////////////////////////////
void uart_init(void)
{
    UBRRH = 0;            // baudrate-ul este pe 16 biti si daca procesorul merge la 16 MHz
    UBRRL = 0x67;        //    pentru un baudrate de 9600 registrul UBRR va fi 0x0067

    UCSRB = _BV(RXEN) | _BV(TXEN);        // UART-ul este activat pentru receptie si transmisie

    UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0);     // UART-ul este configurat pentru Rx/Tx de 8 biti
                                                    // implicit USBS este 0   = un sigur bit de STOP
                                                    // implicit UPM1:0 sunt 0 = fara paritate
    stdout = &bluetooth_uart_stdout;
    stdin  = &bluetooth_uart_stdin;

}



